/*
 * socket.c
 *
 *  Created on: 26/11/2011
 *      Author: alejandro
 */

#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#include <string.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <sys/wait.h>
#include "funcionesYEstructurasRaid.h"
#include "Protocolo_NIPC.h"

extern int32_t offsetSectorMaximo;

int32_t handshakePRAID_PPDInicial(int socket, paquete *NIPC){
	int32_t cantidadSectores;
	paquete *enviarNIPC;
	enviarNIPC = (paquete*)malloc(sizeof(paquete));
	enviarNIPC->nroSector = 0;
	cantidadSectores = NIPC->nroSector;
	if(NIPC->type==0){
		/*si la conexion es correcta */
		enviarNIPC->type = 0;
		enviarNIPC->payload_Length = 0;
		strcpy(enviarNIPC->payload, "");
		send(socket, enviarNIPC, sizeof(paquete), MSG_NOSIGNAL);
	}
	else{
		/*si la conexion es incorrecta */
		enviarNIPC->type = 0;
		strcpy(enviarNIPC->payload,"Se produjo un error en la conexion\n");
		enviarNIPC->payload_Length = strlen(enviarNIPC->payload);
		send(socket, enviarNIPC, sizeof(paquete), MSG_NOSIGNAL);
		close(socket);
		cantidadSectores=0;
	}
	return cantidadSectores;
}

int32_t handshakePRAID_PPD(int socket, paquete *NIPC){
	int32_t cantidadSectores = NIPC->nroSector;
	paquete *enviarNIPC;
	enviarNIPC = (paquete*)malloc(sizeof(paquete));
	if(NIPC->type==0){
		enviarNIPC->type = 0;
		enviarNIPC->payload_Length = 0;                /*si la conexion es correcta */
		strcpy(enviarNIPC->payload, "");
		send(socket, enviarNIPC, sizeof(paquete), MSG_NOSIGNAL);
		if(offsetSectorMaximo!=cantidadSectores){
			close(socket);
			cantidadSectores = -1;
		}
	}
	else{                                              /*si la conexion es incorrecta */
		enviarNIPC->type = 0;
		strcpy(enviarNIPC->payload,"Se produjo un error en la conexion\n");
		enviarNIPC->payload_Length = strlen(enviarNIPC->payload);
		send(socket, enviarNIPC, sizeof(paquete), MSG_NOSIGNAL);
		close(socket);
		cantidadSectores=-1;
	}
	return cantidadSectores;
}

int32_t handshakePRAID_FS(int socket, paquete *NIPC, uint32_t discosConectados){
	int32_t conexionCorrecta;
	paquete *enviarNIPC;
	enviarNIPC = (paquete*) malloc (sizeof(paquete));
	if(NIPC->type==0 && (discosConectados!=0)){
		enviarNIPC->type = 0;
		enviarNIPC->payload_Length = 0;
		strcpy(enviarNIPC->payload, "");
		send(socket, enviarNIPC, sizeof(paquete), MSG_NOSIGNAL);
		conexionCorrecta = 1;
	}
	else{
		enviarNIPC->type = 0;
		strcpy(enviarNIPC->payload, "");
		if(discosConectados)
			strcpy(enviarNIPC->payload, "No hay discos");
		enviarNIPC->payload_Length = strlen(enviarNIPC->payload) + 1;
		send(socket, enviarNIPC, sizeof(paquete), 0);
		close(socket);
		conexionCorrecta = 0;
	}
	return conexionCorrecta;
}

int32_t RAID_RECIBEPEDIDO (int socket, paquete *NIPC){
	int32_t resultado;
	resultado = recv(socket, NIPC, sizeof(paquete), MSG_WAITALL);
	return resultado;
}

int32_t RAID_MANDAPEDIDO (int socket, paquete *NIPC){
	int32_t resultado;
	resultado = send(socket, NIPC, sizeof(paquete), MSG_NOSIGNAL);
	return resultado;
}
